/*
 * Menu.cpp
 *
 *  Created on: Nov 17, 2013
 *      Author: damian
 */

#include <limits>
#include "Menu.h"

using std::cout;
using std::cin;
using std::endl;

Menu::Menu(string opciones) {
	if(!opciones.empty())
		Utilitarios::split(opciones, ",", &(this->opciones));
	ultimaOp = 0;
	titulo.clear();
	salida.clear();
}

Menu::~Menu() {
}

void Menu::setTitulo(string titulo) {
	this->titulo=titulo;
}

void Menu::setOpcionDeSalida(string salida) {
	this->salida=salida;
}

void Menu::setMensajeDeExito(int opcion, string exito) {
	mensajes[(opcion-1)*2] = exito;
}

void Menu::setMensajeDeFracaso(int opcion, string fracaso) {
	mensajes[(opcion-1)*2+1] = fracaso;
}

void Menu::addSubTituloIntercalado(string subtitulo, int opcion) {
	if(opcion)
		subtitulos[opcion-1] = subtitulo;
	else
		subtitulos[getCantidadDeOpciones()] = subtitulo;
}

void Menu::addOpcion(string opcion) {
	opciones.push_back(opcion);
}

void Menu::eraseOpcion(int opcion) {
	opciones.erase(opciones.begin()+opcion-1);
}

void Menu::modifOpcion(int opcion, string nombre) {
	opciones[opcion-1]=nombre;
}

int Menu::mostrarOpciones() {
	if(!opciones.empty()) {
		if(!titulo.empty())
			cout << endl << "- "+titulo+" -" << endl;
		for(unsigned int i=0; i<opciones.size(); i++) {
			if(!subtitulos[i].empty())
				cout << subtitulos[i] << endl;
			cout << i+1 << ") "+opciones[i] << endl;
		}
		if(!salida.empty())
			cout << opciones.size()+1 << ") "+salida << endl;

		string eleccion;
		while(1) {
			eleccion.clear();
			getline(cin, eleccion);
			if(Utilitarios::isANumber(eleccion)) {
				unsigned int elegida = Utilitarios::stringToInt(eleccion);
				bool opCorrecta = elegida > 0 && elegida <= opciones.size();
				bool opSalida = elegida == opciones.size()+1 && !salida.empty();
				if(opCorrecta || opSalida)
					break;
			}
			cout << "La opcion elegida no existe. Vuelva a intentarlo" << endl;
		}

		ultimaOp = Utilitarios::stringToInt(eleccion);
		return ultimaOp;
	}
	return 0;
}

bool Menu::salir() {
	return ultimaOp > (int)opciones.size();
}

bool Menu::mostrarMensaje(bool evaluar, int op) {
	int opcion = op?op:ultimaOp;
	if(evaluar)
		cout << mensajes[(opcion-1)*2] << endl;
	else
		cout << mensajes[(opcion-1)*2+1] << endl;
	return evaluar;
}

int Menu::getNro(string opcion) {
	for(unsigned int i=0; i<opciones.size(); i++)
		if(opciones[i] == opcion)
			return i+1;
	return 0;
}

int Menu::getCantidadDeOpciones() {
	return opciones.size();
}

char Menu::getInputChar(bool ignore) {
	char input = cin.get();
	if(ignore)  // toma el primer char ingresado e ignora el resto
		cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
	return input;
}

bool Menu::pedirConfirmacion(string msj) {
	char decision = 0;
	cout << msj << " (y/n)" << endl;
	while(decision != 'y' && decision != 'n') {
		decision = getInputChar();
	}
	return decision == 'y';
}

void Menu::pressEnterToContinue(string msj) {
	cout << msj << endl;
	while(getInputChar(false) != '\n');
}
